# models/sys_user_oauth_info.py
from sqlalchemy import Column, String, DateTime, Boolean, TEXT
from sqlalchemy.orm import relationship
from src.core.ormdb import Base
from src.core import str_utils as strU


class SysUserOauthInfo(Base):
    """
    第三方 OAuth2 登录补充信息表
    与 sys_user_credentials 为 1:1 或 N:1 关系，
    通过 (provider, openid) 唯一索引保证不会重复绑定。
    """
    __tablename__ = "sys_user_oauth_info"
    __table_args__ = (
        # 同一个平台下 openid 全局唯一
        {'comment': '第三方授权登录扩展信息'}
    )

    id = Column(String(36), primary_key=True, default=lambda: strU.generate_id(),
                comment="主键")

    # 关联到用户主表
    user_id = Column(String(36), nullable=False, comment="用户ID，对应 sys_user.id")

    # 平台标识
    provider = Column(String(20), nullable=False,
                      comment="平台: wechat, wechat_web, qq, apple, alipay, dingtalk ...")

    # 第三方唯一标识
    openid = Column(String(100), nullable=False, comment="第三方 openid")
    unionid = Column(String(100), nullable=True, comment="微信 unionid（跨应用）")

    # 第三方返回的原始信息
    nickname = Column(String(100), nullable=True, comment="第三方昵称")
    avatar_url = Column(String(500), nullable=True, comment="第三方头像 URL")
    gender = Column(String(10), nullable=True, comment="性别: male/female/unknown")
    country = Column(String(50), nullable=True, comment="国家")
    province = Column(String(50), nullable=True, comment="省份")
    city = Column(String(50), nullable=True, comment="城市")

    # 令牌信息（建议加密后落库）
    access_token = Column(TEXT, nullable=True, comment="访问令牌（AES 加密）")
    refresh_token = Column(TEXT, nullable=True, comment="刷新令牌（AES 加密）")
    expires_at = Column(DateTime, nullable=True, comment="access_token 过期时间")
    scope = Column(String(500), nullable=True, comment="授权 scope")

    # 是否已解绑
    unbound = Column(Boolean, default=False, comment="是否已解绑：1 已解绑，0 正常")
    unbound_at = Column(DateTime, nullable=True, comment="解绑时间")
    unbound_by = Column(String(255), nullable=True, comment="解绑者")
    # 审计字段
    create_date = Column(DateTime, default=lambda: strU.now(), comment="首次绑定时间")
    creator_by = Column(String(255), nullable=True, comment="绑定者（系统或管理员）")
    last_updated_date = Column(DateTime, nullable=True, onupdate=lambda: strU.now(),
                               comment="最近一次更新")
    last_updated_by = Column(String(255), nullable=True, comment="更新者")
    # 软删除
    deletion_mark = Column(Boolean, default=False, comment="删除标志：0未删除，1已删除")
    deletion_date = Column(DateTime, nullable=True, comment="删除时间")
    deletion_by = Column(String(255), nullable=True, comment="删除者")

    # 联合唯一索引：同一个平台下 openid 不允许重复
